#ifndef DTU_MEMORY_H
#define DTU_MEMORY_H

#include "dtu_common.h"

/* 内存块信息结构 */
typedef struct memory_block {
    void* ptr;                  /* 内存指针 */
    size_t size;               /* 内存大小 */
    const char* file;          /* 分配文件名 */
    int line;                  /* 分配行号 */
    time_t alloc_time;         /* 分配时间 */
    struct memory_block* next; /* 下一个内存块 */
} memory_block_t;

/* 内存统计信息结构 */
typedef struct {
    size_t total_allocated;    /* 总分配内存 */
    size_t current_allocated;  /* 当前分配内存 */
    size_t peak_allocated;     /* 峰值分配内存 */
    uint32_t alloc_count;      /* 分配次数 */
    uint32_t free_count;       /* 释放次数 */
    uint32_t leak_count;       /* 泄漏次数 */
} memory_stats_t;

/* 内存管理器结构 */
typedef struct {
    memory_block_t* blocks;    /* 内存块链表 */
    memory_stats_t stats;      /* 统计信息 */
    pthread_mutex_t mutex;     /* 互斥锁 */
    bool initialized;          /* 初始化标志 */
} memory_manager_t;

/* 函数声明 */

/**
 * @brief 初始化内存管理器
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_memory_init(void);

/**
 * @brief 销毁内存管理器
 */
void dtu_memory_cleanup(void);

/**
 * @brief 分配内存
 * @param size 内存大小
 * @param file 调用文件名
 * @param line 调用行号
 * @return 内存指针，NULL表示失败
 */
void* dtu_malloc(size_t size, const char* file, int line);

/**
 * @brief 释放内存
 * @param ptr 内存指针
 * @param file 调用文件名
 * @param line 调用行号
 */
void dtu_free(void* ptr, const char* file, int line);

/**
 * @brief 分配并清零内存
 * @param count 元素个数
 * @param size 单个元素大小
 * @param file 调用文件名
 * @param line 调用行号
 * @return 内存指针，NULL表示失败
 */
void* dtu_calloc(size_t count, size_t size, const char* file, int line);

/**
 * @brief 重新分配内存
 * @param ptr 原内存指针
 * @param size 新内存大小
 * @param file 调用文件名
 * @param line 调用行号
 * @return 新内存指针，NULL表示失败
 */
void* dtu_realloc(void* ptr, size_t size, const char* file, int line);

/**
 * @brief 获取内存统计信息
 * @param stats 统计信息结构指针
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_memory_get_stats(memory_stats_t* stats);

/**
 * @brief 检查内存泄漏
 * @return 泄漏的内存块数量
 */
uint32_t dtu_memory_check_leaks(void);

/**
 * @brief 打印内存使用情况
 */
void dtu_memory_print_usage(void);

/**
 * @brief 打印内存泄漏信息
 */
void dtu_memory_print_leaks(void);

/**
 * @brief 验证内存指针有效性
 * @param ptr 内存指针
 * @return true 有效，false 无效
 */
bool dtu_memory_validate_ptr(void* ptr);

/**
 * @brief 获取内存块大小
 * @param ptr 内存指针
 * @return 内存块大小，0表示无效指针
 */
size_t dtu_memory_get_size(void* ptr);

#endif /* DTU_MEMORY_H */
